package plp.expressions2.expression;

import plp.expressions1.util.Tipo;
import plp.expressions1.util.TipoPrimitivo;
import plp.expressions2.memory.AmbienteCompilacao;
import plp.expressions2.memory.AmbienteExecucao;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;

public class ExpGreaterThanOrEquals extends ExpBinaria{

	public ExpGreaterThanOrEquals(Expressao esq, Expressao dir) {
		super(esq, dir, ">=");
	}

	public Valor avaliar(AmbienteExecucao amb)
			throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
		ValorConcreto esq = (ValorConcreto) getEsq().avaliar(amb);
		ValorConcreto dir = (ValorConcreto) getDir().avaliar(amb);
		return new ValorBooleano(esq.isGreaterThanOrEqual(dir));
	}

	public Tipo getTipo(AmbienteCompilacao amb) {
		return TipoPrimitivo.BOOLEANO;
	}

	@Override
	protected boolean checaTipoElementoTerminal(AmbienteCompilacao ambiente) {
		return getEsq().getTipo(ambiente).eIgual(getDir().getTipo(ambiente));
	}

	@Override
	public ExpBinaria clone() {
		return new ExpGreaterThanOrEquals(esq.clone(), dir.clone());
	}
}
